import pandas as pd
from pandas.api.types import CategoricalDtype
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['figure.figsize'] = (12, 9)
sns.set_theme(style="darkgrid", color_codes=True)

# Read in the data
df_census = pd.read_csv('../geodata/census11_21/data_obce_vyhl_nevyhl.csv', sep=',')
df_dluhy = pd.read_csv('../geodata/score/obce_skore_rizikovosti.csv', sep=';')
df = pd.merge(df_census, df_dluhy, on='OBEC_KOD', how='inner')    
df = df.rename(columns={'OBEC_KOD': 'kod_obec', 'vzdelani_bez_mean': 'Bez vzdělání', 'vzdelani_zakl_mean': 'Základní vzdělání', 'vzdelani_str_bm_mean': 'Středoškolské vzdělání bez maturity', 'vzdelani_str_np_mean': 'Středoškolské vzdělání s maturitou', 'vzdelani_vo_mean': 'Vyšší odborné vzdělání', 'vzdelani_vys_mean': 'Vysokoškolské vzdělání'  })

# oD.cat -> into categorical value
size_cat_type = CategoricalDtype(categories=["0-100", "100-200", "200-500", "500-1k", "1-2k", "2-5k", "5-20k", "20-50k", "50-200k", "200k+"], ordered=True)
df['oD.cat'] = df['oD.cat'].astype(size_cat_type)

df.head()
deti_0_2021 deti_1_2021 deti_2_2021 deti_3_2021 deti_4_2021 deti_5_vice_2021 deti_nezj_2021 domy_mat_drevo_2021 domy_mat_kamen_cihly_2021 domy_mat_nep_cihly_2021 ... domy_vlast_fyz_vyhl_mean OBEC OKRES oD oD.cat rb rb.raw re re.raw score
0 0.194969 0.143396 0.488050 0.137107 0.021384 0.003774 0.011321 0.014563 0.747573 0.033981 ... 0.933068 Želechovice nad Dřevnicí Zlín 1611.266667 1-2k 0.004460 0.003889 0.043303 0.043303 0.005674
1 0.182711 0.133595 0.469548 0.157171 0.025540 0.013752 0.017682 0.029255 0.832447 0.005319 ... 0.885312 Petrov nad Desnou Šumperk 1040.133333 1-2k 0.019063 0.019933 0.074220 0.074220 0.015435
2 0.176471 0.130560 0.486370 0.157819 0.024390 0.014347 0.010043 0.021583 0.839928 0.014388 ... 0.949413 Libhošť Nový Jičín 1416.133333 1-2k 0.009005 0.008756 0.035672 0.035672 0.007340
3 0.202192 0.114495 0.455542 0.154689 0.043849 0.015834 0.013398 0.052381 0.838095 0.000000 ... 0.960576 Veřovice Nový Jičín 1671.866667 1-2k 0.008651 0.008414 0.031086 0.031086 0.006798
4 0.190068 0.163527 0.511130 0.106164 0.009418 0.005993 0.013699 0.017104 0.873432 0.010262 ... 0.974288 Vřesina Ostrava-město 2453.266667 2-5k 0.004814 0.004457 0.034762 0.034762 0.005172

5 rows × 169 columns

def make_plot(x,y):
    # p1 = sns.scatterplot(x=x, y=y, data=df, hue='score', palette='coolwarm', legend=True)
    # p1.map_dataframe(sns.lineplot, x, y, color='g')
    sns.regplot(data=df, x=x, y=y)
    plt.show()
def make_plot_proc(x,y,proc):
    plt.xlim(0, proc)
    plt.ylim(0, proc)
    sns.scatterplot(x=x, y=y, data=df)
    plt.show()
def make_plot_all_in_one(x,y):
    # sns.scatterplot(x=x, y=y, data=df)
    sns.regplot(data=df, x=x, y=y)

Úvod

V poslední několika letech jsme v České republice mohli zaznamenat několik zajímavých mikroekonomických událostí. Výrazně narostla kupní síla, obyvatelstvo více utrácelo, ale i se znatelně zadlužilo. To se mimo jiné projevilo i na růstu e-commerce a maloobchodu. Další nevídanou situací byl i znatelný růst cen nemovitostí napříč českými městy i suburbii způsobený mimojiné nezastavitelnou poptávkou po novém bydlení, investicím a nebo jen touze získat více místa či zahradu.

To vše, vzhledem k negativnímu vývoji situace, má vliv na rekordní zadlužení obyvatelstva. Každá instituce poskytující úvěry fyzickým osobám se tak musí chovat opatrněji a věnovat více pozornosti, komu peníze poskytuje. V tomto projektu se podíváme na to, jak lze využít moderních technologií, věřejně dostupných dat a data science ke svému prospěchu.

Pro finanční instituace poskytující úvěry, či obchodníky nabízející své zboží nebo služby s odloženou splatností, by tak mohlo být zajímavé, jaké faktory ovlivňují schopnost splácení klientů. To by samo o sobě mohlo napomoci k větší obezřetnosti prodejce, přesnějšímu marketingovému cílení a nebo naopak k uzpůsobení služeb jednotlivým skupinám obyvatelstva.

Podíváme se tak na vztah mezi agregovanými daty ze sčítání lidu a podílu exekucí a bankrotů v jednotlivých obcích a pokusíme se z nich odvodit, jaké sociodemografických údaje ovlivňují, zda jsou obyvatelé schopni splácet své dluhy či nikoli.

Data

Využijeme vybrané výsledky ze sčítání lidu z roku 2011 a 2021 a data o exekucích a bankrotech za jednotlivé obce České republiky.

Původ dat

Celá datová sada za jednotlivé obce České republiky obsahuje:

  • vybrané výsledky sčítání lidu 2011 a 2021
  • počet obyvatel celkem v jednotlivých sociodemografických skupinách
  • výskyt vybraných trestných činů
  • podíl osob v bankrotu či exekuci

Byla stažena ze stránek nextcloud.profinit.eu, pravděpodobně je ale původ neagregovaných datasetů od Českého statistického úřadu.

Stručný popis

Pojďme si představit používané datasety a jejich strukturu. Oba datasety jsou díky dělení na obce velmi granulované a tím i relativně dlouhé.

Sčítání lidu (Cenzus)

Data ze sčítání lidu z let 2011 a 2021 (geodata/census11_21/data_obce_vyhl_nevyhl.csv) jsou obsáhlá v jednom souboru a obsahují informace o jednotlivých obcích. Každá obec má svůj řádek a sloupce obsahují informace o jednotlivých sociodemografických skupinách. Výsledky jsou však agregované, takže neobsahují informace o jednotlivých obyvatelích, ale o celkovém počtu obyvatel v daných skupinách. V datech tak máme například pro každou obec v České republice informaci o počtu dětí, vzdělání, věku, rodinného stavu, občanství, ale i o vlastníkovi domů (družstvo, fyz. osoba, obec/stát, podílové) či stavebního materiálu domu, ve kterém obyvatelé žijí a mnoho více.

Dataset je složený z 6246 pozorování o 160 proměnných. Díky tomu je dataset velmi široký a obsahuje velikou škálu sociodemografikcých údajů. Každé pozorování je vytvořeno pro obec, kterých je celkem 6246.

Exekuce a bankroty

Data o exekucích a bankrotech (geodata/score/obce_skore_rizikovosti.csv) jsou dělená dle obcí České republiky a obsahují informace o podílu exekucí (klouzavý průměr za roky 2018-2021) a bankrotů (klouzavý průměr za orky 2018-2021) v jednotlivých obcích. Výsledky jsou agregované, takže neobsahují informace o jednotlivých obyvatelích, ale o celkovém počtu exekucí a bankrotů v dané obci. Mimojiné obsahují i tzv. skóre obce, které je výsledkem normovaného průměru počtu exekucí a bankrotů v obci. Toto skóre je v rozmezí 0 až 1, kde 0 znamená, že v obci nebyly žádné exekuce ani bankroty a 1 znamená, že v obci byly exekuce a bankroty v průměru v každém roce.

Dataset je složený z 6254 pozorování o 10 proměnných. Každé porování je vytvořeno pro obec, kterých je celkem 6254.

Kvalita dat

Data ze sčítání lidu z nějakého důvodu neobsahují data ze 14 obcí. Dle struktury území ČR mezi roky 2013 a 2022 od ČSÚ je v České republice (od 1.1.2016) celkem 6260 obcí. V našich datech je však "pouze" 6246 resp. 6254 obcí pro dataset exekucí. Těžko říct, zda je to chyba v našich datech, nebo v původních datech od ČSÚ, ale i mezi datasety je rozdíl v 8 obcích, které ve výsledcích ze sčítání lidu chybějí. Konkrétně se jedná o obce:

  • (500062) Krhová v okrese Vsetín - 2024 obyvatel
  • (500071) Poličná v okrese Vsetín - 1745 obyvatel
  • (500101) Bražec v okrese Karlovy Vary - 221 obyvatel
  • (500127) Doupovské Hradiště v okrese Karlovy Vary - 160 obyvatel
  • (500135) Kozlov v okrese Olomouc - 270 obyvatel
  • (500151) Luboměř pod Strážnou v okrese Přerov - 122 obyvatel
  • (500160) Město Libavá v okrese Olomouc - 0 obyvatel
  • (500194) Polná na Šumavě v okrese Český Krumlov - 202 obyvatel

Ač se jedná o obce (pro nás) v relativně zajímavém místě (s předpokládanou horší ekonomickou situací), tak se jedná o relativně malé obce, takže bychom je nemuseli brát v úvahu.

Dle výstupů z nástroje pandas-profiling žádný ze zmíněných datasetů nemá problém s chybějícími daty ve sloupcích. Jediné, co je vhodné upravit jsou názvy sloupců, ale ty jsou vždy vysvětleny v přiložených textových souborech.

Příběhy

Poskytnuté datasety jsou velmi obsáhlé a obsahují veliké množství informací. Na jejich základě by mělo být možné vytvořit (a podložit) veliké množství příběhů.

Vzdělání a dluhy

V prním příběhu se podíváme na vztah vzdělání a dluhů. Můžeme nějak využít informace o počtu vysokoškoláků zastoupených v obci?

# df_census_edu = df_census[['OBEC_KOD', 'vzdelani_bez_mean', 'vzdelani_zakl_mean', 'vzdelani_str_bm_mean', 'vzdelani_str_np_mean', 'vzdelani_vo_mean', 'vzdelani_vys_mean'  ]]

# data_edu = ['vzdelani_bez_mean', 'vzdelani_zakl_mean', 'vzdelani_str_bm_mean', 'vzdelani_str_np_mean', 'vzdelani_vo_mean', 'vzdelani_vys_mean'  ]
# data_edu = ['Bez vzdělání', 'Základní vzdělání', 'Středoškolské vzdělání bez maturity', 'Středoškolské vzdělání s maturitou', 'Vyšší odborné vzdělání', 'Vysokoškolské vzdělání']
data_edu = ['Vysokoškolské vzdělání']
# data_edu = ['bez','zakl', 'str_bm', 'str_np', 'vo', 'vys' ]
data_score = ['score']

for edu in data_edu:
    make_plot(edu, data_score[0])
# plt.xlabel('Vzdělání')
# plt.ylabel('Skóre')
# plt.legend(labels=data_edu)
# plt.show()
    # make_plot(dato, data_score)
# make_plot_all_in_one(data_vzdelani, data_score)

Dle grafu výše se zdá, že s přibývajícím počtem vysokoškoláků v obci klesá i skóre zadlužení obce. To znamená, že obce s vysokoškoláky mají méně dluhů. To je ale jen první pohled na data. Co když se podíváme na poměr mezi počtem vysokoškoláků a počtem obyvatel v obci? Výsledek je následující:

data_edu = ['Vysokoškolské vzdělání']
# data_edu = ['bez','zakl', 'str_bm', 'str_np', 'vo', 'vys' ]
data_size = ['oD.cat']

# df['oD.cat'].value_counts()

# for edu in data_edu:
#     make_plot(edu, data_score[0])
sns.catplot(x=data_edu[0], y=data_size[0], data=df, kind="bar", ci=None)
plt.ylabel('Velikost obce')
Text(-16.04, 0.5, 'Velikost obce')

Jak můžeme vidět, s velikostí obce nám roste i počet vysokoškoláků. Jaký vztah tedy má velikost a zadlužení obce?

data_score = ['score']
data_size = ['oD.cat']

# for edu in data_edu:
# make_plot(data_score[0], data_size[0])
sns.boxplot(x=data_score[0], y=data_size[0], data=df)
plt.ylabel('Velikost obce')
plt.xlabel('Skóre zadlužení')
plt.show()
Text(0.5, 0, 'Skóre')

Zde můžeme vidět, že velikost obce až takový vliv na její skóre zadlužení nemá (až na několik výjimek). To znamená, že vysokoškoláci nejsou zodpovědní za to, že obce mají méně dluhů.